﻿function parseBigInt(a, b) {
    return new BigInteger(a, b)
}
function linebrk(a, b) {
    for (var c = "", d = 0; d + b < a.length; )
        c += a.substring(d, d + b) + "\n", d += b;
    return c + a.substring(d, a.length)
}
function byte2Hex(a) {
    return a < 16 ? "0" + a.toString(16) : a.toString(16)
}
function pkcs1pad2(a, b) {
    if (b < a.length + 11)
        return uv_alert("Message too long for RSA"), null;
    for (var c = [], d = a.length - 1; d >= 0 && b > 0; ) {
        var e = a.charCodeAt(d--);
        e < 128 ? c[--b] = e : e > 127 && e < 2048 ? (c[--b] = e & 63 | 128, c[--b] = e >> 6 | 192) : (c[--b] = e & 63 | 128, c[--b] = e >> 6 & 63 | 128, c[--b] = e >> 12 | 224)
    }
    c[--b] = 0;
    d = new SecureRandom;
    for (e = []; b > 2; ) {
        for (e[0] = 0; e[0] == 0; )
            d.nextBytes(e);
        c[--b] = e[0]
    }
    c[--b] = 2;
    c[--b] = 0;
    return new BigInteger(c)
}
function RSAKey() {
    this.n = null;
    this.e = 0;
    this.coeff = this.dmq1 = this.dmp1 = this.q = this.p = this.d = null
}
function RSASetPublic(a, b) {
    a != null && b != null && a.length > 0 && b.length > 0 ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16)) : uv_alert("Invalid RSA public key")
}
function RSADoPublic(a) {
    return a.modPowInt(this.e, this.n)
}
function RSAEncrypt(a) {
    a = pkcs1pad2(a, this.n.bitLength() + 7 >> 3);
    if (a == null)
        return null;
    a = this.doPublic(a);
    if (a == null)
        return null;
    a = a.toString(16);
    return (a.length & 1) == 0 ? a : "0" + a
}
RSAKey.prototype.doPublic = RSADoPublic;
RSAKey.prototype.setPublic = RSASetPublic;
RSAKey.prototype.encrypt = RSAEncrypt;
var dbits, canary = 244837814094590, j_lm = (canary & 16777215) == 15715070;
function BigInteger(a, b, c) {
    a != null && ("number" == typeof a ? this.fromNumber(a, b, c) : b == null && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b))
}
function nbi() {
    return new BigInteger(null)
}
function am1(a, b, c, d, e, f) {
    for (; --f >= 0; ) {
        var g = b * this[a++] + c[d] + e, e = Math.floor(g / 67108864);
        c[d++] = g & 67108863
    }
    return e
}
function am2(a, b, c, d, e, f) {
    var g = b & 32767;
    for (b >>= 15; --f >= 0; ) {
        var h = this[a] & 32767, i = this[a++] >> 15, k = b * h + i * g, h = g * h + ((k & 32767) << 15) + c[d] + (e & 1073741823), e = (h >>> 30) + (k >>> 15) + b * i + (e >>> 30);
        c[d++] = h & 1073741823
    }
    return e
}
function am3(a, b, c, d, e, f) {
    var g = b & 16383;
    for (b >>= 14; --f >= 0; ) {
        var h = this[a] & 16383, i = this[a++] >> 14, k = b * h + i * g, h = g * h + ((k & 16383) << 14) + c[d] + e, e = (h >> 28) + (k >> 14) + b * i;
        c[d++] = h & 268435455
    }
    return e
}
j_lm && navigator.appName == "Microsoft Internet Explorer" ? (BigInteger.prototype.am = am2, dbits = 30) : j_lm && navigator.appName != "Netscape" ? (BigInteger.prototype.am = am1, dbits = 26) : (BigInteger.prototype.am = am3, dbits = 28);
BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = (1 << dbits) - 1;
BigInteger.prototype.DV = 1 << dbits;
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz", BI_RC = [], rr, vv;
rr = "0".charCodeAt(0);
for (vv = 0; vv <= 9; ++vv)
    BI_RC[rr++] = vv;
rr = "a".charCodeAt(0);
for (vv = 10; vv < 36; ++vv)
    BI_RC[rr++] = vv;
rr = "A".charCodeAt(0);
for (vv = 10; vv < 36; ++vv)
    BI_RC[rr++] = vv;
function int2char(a) {
    return BI_RM.charAt(a)
}
function intAt(a, b) {
    var c = BI_RC[a.charCodeAt(b)];
    return c == null ? -1 : c
}
function bnpCopyTo(a) {
    for (var b = this.t - 1; b >= 0; --b)
        a[b] = this[b];
    a.t = this.t;
    a.s = this.s
}
function bnpFromInt(a) {
    this.t = 1;
    this.s = a < 0 ? -1 : 0;
    a > 0 ? this[0] = a : a < -1 ? this[0] = a + DV : this.t = 0
}
function nbv(a) {
    var b = nbi();
    b.fromInt(a);
    return b
}
function bnpFromString(a, b) {
    var c;
    if (b == 16)
        c = 4;
    else if (b == 8)
        c = 3;
    else if (b == 256)
        c = 8;
    else if (b == 2)
        c = 1;
    else if (b == 32)
        c = 5;
    else if (b == 4)
        c = 2;
    else {
        this.fromRadix(a, b);
        return
    }
    this.s = this.t = 0;
    for (var d = a.length, e = false, f = 0; --d >= 0; ) {
        var g = c == 8 ? a[d] & 255 : intAt(a, d);
        g < 0 ? a.charAt(d) == "-" && (e = true) : (e = false, f == 0 ? this[this.t++] = g : f + c > this.DB ? (this[this.t - 1] |= (g & (1 << this.DB - f) - 1) << f, this[this.t++] = g >> this.DB - f) : this[this.t - 1] |= g << f, f += c, f >= this.DB && (f -= this.DB))
    }
    if (c == 8 && (a[0] & 128) != 0)
        this.s = -1, f > 0 && (this[this.t -
        1] |= (1 << this.DB - f) - 1 << f);
    this.clamp();
    e && BigInteger.ZERO.subTo(this, this)
}
function bnpClamp() {
    for (var a = this.s & this.DM; this.t > 0 && this[this.t - 1] == a; )
        --this.t
}
function bnToString(a) {
    if (this.s < 0)
        return "-" + this.negate().toString(a);
    if (a == 16)
        a = 4;
    else if (a == 8)
        a = 3;
    else if (a == 2)
        a = 1;
    else if (a == 32)
        a = 5;
    else if (a == 4)
        a = 2;
    else
        return this.toRadix(a);
    var b = (1 << a) - 1, c, d = false, e = "", f = this.t, g = this.DB - f * this.DB % a;
    if (f-- > 0) {
        if (g < this.DB && (c = this[f] >> g) > 0)
            d = true, e = int2char(c);
        for (; f >= 0; )
            g < a ? (c = (this[f] & (1 << g) - 1) << a - g, c |= this[--f] >> (g += this.DB - a)) : (c = this[f] >> (g -= a) & b, g <= 0 && (g += this.DB, --f)), c > 0 && (d = true), d && (e += int2char(c))
    }
    return d ? e : "0"
}
function bnNegate() {
    var a = nbi();
    BigInteger.ZERO.subTo(this, a);
    return a
}
function bnAbs() {
    return this.s < 0 ? this.negate() : this
}
function bnCompareTo(a) {
    var b = this.s - a.s;
    if (b != 0)
        return b;
    var c = this.t, b = c - a.t;
    if (b != 0)
        return b;
    for (; --c >= 0; )
        if ((b = this[c] - a[c]) != 0)
            return b;
    return 0
}
function nbits(a) {
    var b = 1, c;
    if ((c = a >>> 16) != 0)
        a = c, b += 16;
    if ((c = a >> 8) != 0)
        a = c, b += 8;
    if ((c = a >> 4) != 0)
        a = c, b += 4;
    if ((c = a >> 2) != 0)
        a = c, b += 2;
    a >> 1 != 0 && (b += 1);
    return b
}
function bnBitLength() {
    return this.t <= 0 ? 0 : this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM)
}
function bnpDLShiftTo(a, b) {
    var c;
    for (c = this.t - 1; c >= 0; --c)
        b[c + a] = this[c];
    for (c = a - 1; c >= 0; --c)
        b[c] = 0;
    b.t = this.t + a;
    b.s = this.s
}
function bnpDRShiftTo(a, b) {
    for (var c = a; c < this.t; ++c)
        b[c - a] = this[c];
    b.t = Math.max(this.t - a, 0);
    b.s = this.s
}
function bnpLShiftTo(a, b) {
    var c = a % this.DB, d = this.DB - c, e = (1 << d) - 1, f = Math.floor(a / this.DB), g = this.s << c & this.DM, h;
    for (h = this.t - 1; h >= 0; --h)
        b[h + f + 1] = this[h] >> d | g, g = (this[h] & e) << c;
    for (h = f - 1; h >= 0; --h)
        b[h] = 0;
    b[f] = g;
    b.t = this.t + f + 1;
    b.s = this.s;
    b.clamp()
}
function bnpRShiftTo(a, b) {
    b.s = this.s;
    var c = Math.floor(a / this.DB);
    if (c >= this.t)
        b.t = 0;
    else {
        var d = a % this.DB, e = this.DB - d, f = (1 << d) - 1;
        b[0] = this[c] >> d;
        for (var g = c + 1; g < this.t; ++g)
            b[g - c - 1] |= (this[g] & f) << e, b[g - c] = this[g] >> d;
        d > 0 && (b[this.t - c - 1] |= (this.s & f) << e);
        b.t = this.t - c;
        b.clamp()
    }
}
function bnpSubTo(a, b) {
    for (var c = 0, d = 0, e = Math.min(a.t, this.t); c < e; )
        d += this[c] - a[c], b[c++] = d & this.DM, d >>= this.DB;
    if (a.t < this.t) {
        for (d -= a.s; c < this.t; )
            d += this[c], b[c++] = d & this.DM, d >>= this.DB;
        d += this.s
    } else {
        for (d += this.s; c < a.t; )
            d -= a[c], b[c++] = d & this.DM, d >>= this.DB;
        d -= a.s
    }
    b.s = d < 0 ? -1 : 0;
    d < -1 ? b[c++] = this.DV + d : d > 0 && (b[c++] = d);
    b.t = c;
    b.clamp()
}
function bnpMultiplyTo(a, b) {
    var c = this.abs(), d = a.abs(), e = c.t;
    for (b.t = e + d.t; --e >= 0; )
        b[e] = 0;
    for (e = 0; e < d.t; ++e)
        b[e + c.t] = c.am(0, d[e], b, e, 0, c.t);
    b.s = 0;
    b.clamp();
    this.s != a.s && BigInteger.ZERO.subTo(b, b)
}
function bnpSquareTo(a) {
    for (var b = this.abs(), c = a.t = 2 * b.t; --c >= 0; )
        a[c] = 0;
    for (c = 0; c < b.t - 1; ++c) {
        var d = b.am(c, b[c], a, 2 * c, 0, 1);
        if ((a[c + b.t] += b.am(c + 1, 2 * b[c], a, 2 * c + 1, d, b.t - c - 1)) >= b.DV)
            a[c + b.t] -= b.DV, a[c + b.t + 1] = 1
    }
    a.t > 0 && (a[a.t - 1] += b.am(c, b[c], a, 2 * c, 0, 1));
    a.s = 0;
    a.clamp()
}
function bnpDivRemTo(a, b, c) {
    var d = a.abs();
    if (!(d.t <= 0)) {
        var e = this.abs();
        if (e.t < d.t)
            b != null && b.fromInt(0), c != null && this.copyTo(c);
        else {
            c == null && (c = nbi());
            var f = nbi(), g = this.s, a = a.s, h = this.DB - nbits(d[d.t - 1]);
            h > 0 ? (d.lShiftTo(h, f), e.lShiftTo(h, c)) : (d.copyTo(f), e.copyTo(c));
            d = f.t;
            e = f[d - 1];
            if (e != 0) {
                var i = e * (1 << this.F1) + (d > 1 ? f[d - 2] >> this.F2 : 0), k = this.FV / i, i = (1 << this.F1) / i, o = 1 << this.F2, l = c.t, m = l - d, j = b == null ? nbi() : b;
                f.dlShiftTo(m, j);
                c.compareTo(j) >= 0 && (c[c.t++] = 1, c.subTo(j, c));
                BigInteger.ONE.dlShiftTo(d,
                j);
                for (j.subTo(f, f); f.t < d; )
                    f[f.t++] = 0;
                for (; --m >= 0; ) {
                    var n = c[--l] == e ? this.DM : Math.floor(c[l] * k + (c[l - 1] + o) * i);
                    if ((c[l] += f.am(0, n, c, m, 0, d)) < n) {
                        f.dlShiftTo(m, j);
                        for (c.subTo(j, c); c[l] < --n; )
                            c.subTo(j, c)
                    }
                }
                b != null && (c.drShiftTo(d, b), g != a && BigInteger.ZERO.subTo(b, b));
                c.t = d;
                c.clamp();
                h > 0 && c.rShiftTo(h, c);
                g < 0 && BigInteger.ZERO.subTo(c, c)
            }
        }
    }
}
function bnMod(a) {
    var b = nbi();
    this.abs().divRemTo(a, null, b);
    this.s < 0 && b.compareTo(BigInteger.ZERO) > 0 && a.subTo(b, b);
    return b
}
function Classic(a) {
    this.m = a
}
function cConvert(a) {
    return a.s < 0 || a.compareTo(this.m) >= 0 ? a.mod(this.m) : a
}
function cRevert(a) {
    return a
}
function cReduce(a) {
    a.divRemTo(this.m, null, a)
}
function cMulTo(a, b, c) {
    a.multiplyTo(b, c);
    this.reduce(c)
}
function cSqrTo(a, b) {
    a.squareTo(b);
    this.reduce(b)
}
Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;
function bnpInvDigit() {
    if (this.t < 1)
        return 0;
    var a = this[0];
    if ((a & 1) == 0)
        return 0;
    var b = a & 3, b = b * (2 - (a & 15) * b) & 15, b = b * (2 - (a & 255) * b) & 255, b = b * (2 - ((a & 65535) * b & 65535)) & 65535, b = b * (2 - a * b % this.DV) % this.DV;
    return b > 0 ? this.DV - b : -b
}
function Montgomery(a) {
    this.m = a;
    this.mp = a.invDigit();
    this.mpl = this.mp & 32767;
    this.mph = this.mp >> 15;
    this.um = (1 << a.DB - 15) - 1;
    this.mt2 = 2 * a.t
}
function montConvert(a) {
    var b = nbi();
    a.abs().dlShiftTo(this.m.t, b);
    b.divRemTo(this.m, null, b);
    a.s < 0 && b.compareTo(BigInteger.ZERO) > 0 && this.m.subTo(b, b);
    return b
}
function montRevert(a) {
    var b = nbi();
    a.copyTo(b);
    this.reduce(b);
    return b
}
function montReduce(a) {
    for (; a.t <= this.mt2; )
        a[a.t++] = 0;
    for (var b = 0; b < this.m.t; ++b) {
        var c = a[b] & 32767, d = c * this.mpl + ((c * this.mph + (a[b] >> 15) * this.mpl & this.um) << 15) & a.DM, c = b + this.m.t;
        for (a[c] += this.m.am(0, d, a, b, 0, this.m.t); a[c] >= a.DV; )
            a[c] -= a.DV, a[++c]++
    }
    a.clamp();
    a.drShiftTo(this.m.t, a);
    a.compareTo(this.m) >= 0 && a.subTo(this.m, a)
}
function montSqrTo(a, b) {
    a.squareTo(b);
    this.reduce(b)
}
function montMulTo(a, b, c) {
    a.multiplyTo(b, c);
    this.reduce(c)
}
Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;
function bnpIsEven() {
    return (this.t > 0 ? this[0] & 1 : this.s) == 0
}
function bnpExp(a, b) {
    if (a > 4294967295 || a < 1)
        return BigInteger.ONE;
    var c = nbi(), d = nbi(), e = b.convert(this), f = nbits(a) - 1;
    for (e.copyTo(c); --f >= 0; )
        if (b.sqrTo(c, d), (a & 1 << f) > 0)
            b.mulTo(d, e, c);
        else
            var g = c, c = d, d = g;
    return b.revert(c)
}
function bnModPowInt(a, b) {
    var c;
    c = a < 256 || b.isEven() ? new Classic(b) : new Montgomery(b);
    return this.exp(a, c)
}
BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);
var rng_state, rng_pool, rng_pptr;
function rng_seed_int(a) {
    rng_pool[rng_pptr++] ^= a & 255;
    rng_pool[rng_pptr++] ^= a >> 8 & 255;
    rng_pool[rng_pptr++] ^= a >> 16 & 255;
    rng_pool[rng_pptr++] ^= a >> 24 & 255;
    rng_pptr >= rng_psize && (rng_pptr -= rng_psize)
}
function rng_seed_time() {
    rng_seed_int((new Date).getTime())
}
if (rng_pool == null) {
    rng_pool = [];
    rng_pptr = 0;
    var t;
    if (navigator.appName == "Netscape" && navigator.appVersion < "5" && window.crypto) {
        var z = window.crypto.random(32);
        for (t = 0; t < z.length; ++t)
            rng_pool[rng_pptr++] = z.charCodeAt(t) & 255
    }
    for (; rng_pptr < rng_psize; )
        t = Math.floor(65536 * Math.random()), rng_pool[rng_pptr++] = t >>> 8, rng_pool[rng_pptr++] = t & 255;
    rng_pptr = 0;
    rng_seed_time()
}
function rng_get_byte() {
    if (rng_state == null) {
        rng_seed_time();
        rng_state = prng_newstate();
        rng_state.init(rng_pool);
        for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
            rng_pool[rng_pptr] = 0;
        rng_pptr = 0
    }
    return rng_state.next()
}
function rng_get_bytes(a) {
    var b;
    for (b = 0; b < a.length; ++b)
        a[b] = rng_get_byte()
}
function SecureRandom() {
}
SecureRandom.prototype.nextBytes = rng_get_bytes;
function Arcfour() {
    this.j = this.i = 0;
    this.S = []
}
function ARC4init(a) {
    var b, c, d;
    for (b = 0; b < 256; ++b)
        this.S[b] = b;
    for (b = c = 0; b < 256; ++b)
        c = c + this.S[b] + a[b % a.length] & 255, d = this.S[b], this.S[b] = this.S[c], this.S[c] = d;
    this.j = this.i = 0
}
function ARC4next() {
    var a;
    this.i = this.i + 1 & 255;
    this.j = this.j + this.S[this.i] & 255;
    a = this.S[this.i];
    this.S[this.i] = this.S[this.j];
    this.S[this.j] = a;
    return this.S[a + this.S[this.i] & 255]
}
Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;
function prng_newstate() {
    return new Arcfour
}
var rng_psize = 256;
